package com.Sep_thirty;

/**
 * 654. 最大二叉树
 * 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
 *
 * 创建一个根节点，其值为 nums 中的最大值。
 * 递归地在最大值 左边 的 子数组前缀上 构建左子树。
 * 递归地在最大值 右边 的 子数组后缀上 构建右子树。
 * 返回 nums 构建的 最大二叉树
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/maximum-binary-tree
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

public class Solution654 {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return maxTree(nums,0,nums.length-1);
    }

    public TreeNode maxTree(int[] nums,int left,int right){
        if (left>right) return null;
        int maxIndex=getMax(nums,left,right);
        TreeNode root=new TreeNode(nums[maxIndex]);
        root.left=maxTree(nums,left,maxIndex-1);
        root.right=maxTree(nums,maxIndex+1,right);
        return root;
    }

    public int getMax(int[] nums,int left,int right){
        int max=Integer.MIN_VALUE,maxIndex=left;
        for (int i=left;i<=right;i++)
        {
            if (nums[i]>max)
            {
                max=nums[i];
                maxIndex=i;
            }
        }
        return maxIndex;
    }

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode() {}
        TreeNode(int val) { this.val = val; }
        TreeNode(int val, TreeNode left, TreeNode right) {

            this.val = val;

            this.left = left;

            this.right = right;

        }
    }
}
